/*
 * Clase: UsaMatDisp (Usa Matriz Dispersa)
 *
 * Versi�n 1.0
 *
 * Copyrigth: Trabajo Pr�ctico Hector Morel - Gustavo Plan�s
 *
 */

package ecuacion;

/**
 * Clase UsaMatDisp (Ejemplo de uso de una Matriz Dispersa)
 * Lee la matriz de un Archivo de Texto
 * @author Hector Morel, Gustavo Plan�s
 */

import java.io.*;
import java.util.StringTokenizer;

public class UsaMatDisp {

	public static void main(String args[]) {
		try
		{
			menup();
		}
		catch(Exception e) {System.out.println("No se ha podido leer la matriz");}
	}
	
	public static MatrizDispersa desdeArchivo(String s, String tipo) throws Exception {
		LectorArchTexto ar = new LectorArchTexto();
		ar.abrir(s);
		
		String linea = ar.leerLinea();
		tipo = ar.leerLinea();
		
		tipog = tipo;
		
		int orden = Integer.parseInt(linea);
		
		MatrizDispersa<Entero> mde = new MatrizDispersa<Entero>(orden);
		MatrizDispersa<EnteroLargo> mdl = new MatrizDispersa<EnteroLargo>(orden);
		MatrizDispersa<Doble> mdd = new MatrizDispersa<Doble>(orden);
		MatrizDispersa<PuntoFlotante> mdf = new MatrizDispersa<PuntoFlotante>(orden);
		
		
		
		do {
			
			linea = ar.leerLinea();
			if (linea == null)
				linea = "";
			
				StringTokenizer entrada = new StringTokenizer(linea, ", ", false); 
				
			    //if (entrada.countTokens() < 3)
					//throw new Exception("Error en el archivo");
			  
				if (tipo.compareTo("int") == 0) {
					if (linea.compareTo("") == 0){
						return mde;
					}
					Entero elem = new Entero(Integer.parseInt(entrada.nextToken()));
					int fila = Integer.parseInt(entrada.nextToken());
					int col = Integer.parseInt(entrada.nextToken());
					mde.cargarElemento(elem, fila, col);
					
				}else if (tipo.compareTo("double")==0 ){
					if (linea.compareTo("") == 0)
						return mdd;
					Doble elem = new Doble(Double.parseDouble(entrada.nextToken()));
					int fila = Integer.parseInt(entrada.nextToken());
					int col = Integer.parseInt(entrada.nextToken());
					mdd.cargarElemento(elem, fila, col);
				}	
				else if (tipo.compareTo("float")==0){
					if (linea.compareTo("") == 0)
						return mdf;	
					PuntoFlotante elem = new PuntoFlotante(Float.parseFloat(entrada.nextToken()));
					int fila = Integer.parseInt(entrada.nextToken());
					int col = Integer.parseInt(entrada.nextToken());
					mdf.cargarElemento(elem, fila, col);
				}	
				else if (tipo.compareTo("long") == 0){
					if (linea.compareTo("") == 0)
						return mdl;
					EnteroLargo elem = new EnteroLargo(Long.parseLong(entrada.nextToken()));
					int fila = Integer.parseInt(entrada.nextToken());
					int col = Integer.parseInt(entrada.nextToken());
					mdl.cargarElemento(elem, fila, col);
				}
				
		} while (linea != null);
		
		return new MatrizDispersa(0);
	}
	
	public static void menup() throws Exception{
		System.out.println("��Qu� desea hacer??");
		System.out.println("1. Cargar una matriz desde un archivo");
		System.out.println("2. Cargar dos matrices desde archivos");
		System.out.println("Elija una opcion:");
		
		int o;
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String s;
		s = in.readLine();
		o = Integer.parseInt(s);
		
		if(o == 2)
			binarias();
		else if(o == 1)
			unarias();
	}
	
	public static void binarias()throws Exception {
		String s, t;
		
		System.out.println("Introduzca la direccion y nombre de archivo 1");
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		
		MatrizDispersa m1;
		MatrizDispersa m2;
		
		s = in.readLine();
		
		String tipo = "";
		m1 = desdeArchivo(s, tipo);
		
		System.out.println("Introduzca la direccion y nombre de archivo 2");
		s = in.readLine();
		t = tipog;
		m2 = desdeArchivo(s, t);
		
		if (t.compareTo(tipog) != 0) {
			System.out.println("Tipos incompatbles");
			throw new Exception ("Tipos incompatbles");
		}
		
		System.out.println("La operaciones posibles son: 1)M1 = M1 + M2; 2) M3 = M1 + M2; Cualquier tecla para salir . Que desea hacer??");
		s = in.readLine();
		if (s.compareTo("1") == 0 || s.compareTo("2") == 0) {
			if (s.compareTo("1") == 0) {
				if (tipog.compareTo("int") == 0){
					MatrizDispersa<Entero> m3 = new MatrizDispersa<Entero>(m1.getOrden());
					m3 = m1.suma(m2);
					m3.imprimirMatriz();
				}
				if (tipog.compareTo("float") == 0){
					MatrizDispersa<PuntoFlotante> m3 = new MatrizDispersa<PuntoFlotante>(m1.getOrden());
					m3 = m1.suma(m2);
					m3.imprimirMatriz();
				}
				if (tipog.compareTo("double") == 0){
					MatrizDispersa<Doble> m3 = new MatrizDispersa<Doble>(m1.getOrden());
					m3 = m1.suma(m2);
					m3.imprimirMatriz();
				}
				if (tipog.compareTo("long") == 0){
					MatrizDispersa<EnteroLargo> m3 = new MatrizDispersa<EnteroLargo>(m1.getOrden());
					m3 = m1.suma(m2);
					m3.imprimirMatriz();
				}
			}else {
				m1.sumaMe(m2);
				/*if (tipo.compareTo("int") == 0){
					
				}
				if (tipo.compareTo("float") == 0){
					m1.sumaMe(m2);
				}
				if (tipo.compareTo("double") == 0){
					m1.sumaMe(m2);
				}
				if (tipo.compareTo("long") == 0){
					m1.sumaMe(m2);
				}*/
				m1.imprimirMatriz();
			}	
		}else
			System.out.print("No se ha realizado ninguna operacion");	  	
	}
	
	public static void unarias()throws Exception{
		String s, tipo;
		MatrizDispersa m1;
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("Introduzca la direccion y nombre de archivo");		
		s = in.readLine();
		
		tipo = "";
		
		m1 = desdeArchivo(s, tipo);
		
		System.out.println("Las operaciones posibles son:");
		System.out.println("1- Traspuesta de la matriz");
		System.out.println("2- Inversa de la matriz");
		System.out.println("Cualquier otro n�mero para salir");
		
		s = in.readLine();
		
		if (s.compareTo("1") == 0 || s.compareTo("2") == 0) {
			if (s.compareTo("1") == 0) {
				m1.traspuesta();
				m1.imprimirMatriz();
			} else {
				if (tipog.compareTo("int") == 0) {
					MatrizDispersa<Entero> m3 = new MatrizDispersa<Entero>(m1.getOrden());
					m3 = m1.inversa();
					m3.imprimirMatriz();
				}
				if (tipog.compareTo("float") == 0) {
					MatrizDispersa<PuntoFlotante> m3 = new MatrizDispersa<PuntoFlotante>(m1.getOrden());
					m3 = m1.inversa();
					m3.imprimirMatriz();
				}
				if (tipog.compareTo("double") == 0) {
					MatrizDispersa<Doble> m3 = new MatrizDispersa<Doble>(m1.getOrden());
					m3 = m1.inversa();
					m3.imprimirMatriz();
				}
				if (tipog.compareTo("long") == 0) {
					MatrizDispersa<EnteroLargo> m3 = new MatrizDispersa<EnteroLargo>(m1.getOrden());
					m3 = m1.inversa();
					m3.imprimirMatriz();
				}
			}
		}else
			System.out.print("No se ha realizado ninguna operacion");	  	
	}
	
	static String tipog;
}